<% unless @saved -%>
  TracksPages.page_error("<%= t('todos.error_toggle_complete') %>");
<% else
  # create a unique object name to prevent concurrent toggles to overwrite each other functions
  object_name = unique_object_name_for("toggle_check")
-%>
var <%= object_name %> = {
  animate: function() {
    <% if @wants_redirect_after_complete && @todo.completed? -%>
      <%=object_name%>.redirect_after_complete();
    <% else
      animation = []
      unless source_view_is(:search)
        animation << "remove_todo"
        if @todo.completed?
          animation << "add_to_completed_container" unless source_view_is_one_of(:calendar, :deferred)
          animation << "add_new_recurring_todo"
          animation << "activate_pending_todos"
        else
          animation << "add_todo_to_container" unless source_view_is(:done)
          animation << "block_predecessors"
        end
        animation << "update_empty_container" if source_view_is_one_of(:tag, :todo, :deferred, :project, :context)
        animation << "regenerate_predecessor_family"
      else
        animation << "replace_todo"
      end -%>
      <%= render_animation(animation, object_name) %>
      TracksPages.set_page_badge(<%= @down_count %>);
    <% end -%>
  },
  redirect_after_complete: function() {
    var path = "<%= @todo.project_id.nil? ? root_path : project_path(@todo.project) -%>";
    redirect_to(path);
  },
  remove_todo: function(next_steps) {
    <% if update_needs_to_hide_container
      # remove context with deleted todo
    -%>
      $('#<%= item_container_id(@original_item)%>').slideUp(400, function() {
        $('#<%=dom_id(@todo)%>').remove();
        next_steps.go();
      });
      <%= show_empty_message_in_source_container -%>
    <% else
      # remove only the todo
    -%>
      <%= show_empty_message_in_source_container %>
      $('#<%=dom_id(@todo)%>').slideUp(400, function() {
        $('#<%=dom_id(@todo)%>').remove();
        next_steps.go();
    });
    <% end -%>
  },
  add_to_completed_container: function(next_steps) {
    <% unless current_user.prefs.hide_completed_actions? -%>
      $('#<%= item_container_id(@todo) %>_items').prepend(<%=object_name%>.html_for_todo());
      $("#completed_container-empty-d").slideUp(100);
      <%=object_name%>.highlight_updated_todo(next_steps);
    <% end -%>
  },
  replace_todo: function(next_steps) {
    $('#<%= dom_id(@todo) %>').html(<%=object_name%>.html_for_todo());
    next_steps.go();
  },
  add_todo_to_container: function(next_steps) {
    var container = $('#<%= item_container_id(@todo) %>_items');
    container.append(<%=object_name%>.html_for_todo());
    TracksPages.sort_container(container);
    <% if should_make_context_visible -%>
      $('#<%= item_container_id(@todo) %>').slideDown(500, function() {
        $("#<%= empty_container_msg_div_id %>").slideUp(100);
        <%=object_name%>.highlight_updated_todo(next_steps);
      });
    <% else -%>
      $("#<%= empty_container_msg_div_id(@todo) %>").slideUp(100);
      <%=object_name%>.highlight_updated_todo(next_steps);
    <% end -%>
    <% if @completed_count == 0 -%>
      $("#completed_container-empty-d").slideDown(100);
    <% end -%>
  },
  add_new_recurring_todo: function(next_steps) {
    <%  # show new todo if the completed todo was recurring
      if @todo.from_recurring_todo?
        unless @new_recurring_todo.nil? || (@new_recurring_todo.deferred? && !source_view_is(:deferred)) -%>
        var container = $('#<%= item_container_id(@new_recurring_todo) %>_items');
        conainer.append(<%=object_name%>.html_for_recurring_todo());
        TracksPages.sort_container(container);
        $('#c<%= @new_recurring_todo.context_id %>').slideDown(500, function() {
          <%=object_name%>.highlight_updated_recurring_todo(next_steps);
        });
     <% else
          if @todo.recurring_todo.todos.active.count(:all) == 0 && @new_recurring_todo.nil? -%>
            TracksPages.page_inform("<%=t('todos.recurrence_completed')%>");
     <%   end -%>
          next_steps.go();
     <% end
      else -%>
        next_steps.go();
   <% end -%>
  },
  update_empty_container: function(next_steps) {
    <% if @down_count==0 -%>
      $('#no_todos_in_view').slideDown(400, function(){ next_steps.go(); });
    <% else -%>
      $('#no_todos_in_view').slideUp(400, function(){ next_steps.go(); });
    <% end -%>
  },
<% if @new_recurring_todo # hide js if @new_recurring_todo is not there-%>
  highlight_updated_recurring_todo: function(next_steps) {
    TodoItems.highlight_todo('#<%= dom_id(@new_recurring_todo)%>');
    next_steps.go();
  },
<% end -%>
  highlight_updated_todo: function(next_steps) {
    TodoItems.highlight_todo('#<%= dom_id(@todo)%>');
    next_steps.go();
  },
  activate_pending_todos: function(next_steps) {
   <% # Activate pending todos that are successors of the completed
      if @pending_to_activate
        # do not render the js in case of an error or if no todos to activate
        @pending_to_activate.each do |t|
          html = escape_javascript(render(:partial => t, :locals => { :parent_container_type => parent_container_type }))
          # only project and tag view have a deferred/blocked container
          if source_view_is_one_of(:project,:tag) -%>
            $('#<%= dom_id(t) %>').slideUp(400, function() {
              $('#<%= dom_id(t) %>').remove();
              var container = $('#<%= item_container_id(t) %>_items');
              container.append("<%= html  %>");
              TracksPages.sort_container(container);
              <%= "$('#deferred_pending_container-empty-d').show();".html_safe if @remaining_deferred_or_pending_count==0 -%>
            });
   <%     else -%>
            var container = $('#<%= item_container_id(t) %>_items');
            container.append("<%= html%>");
            TracksPages.sort_container(container);
   <%     end -%>
          TodoItems.highlight_todo('#<%= dom_id(t)%>');
   <%   end -%>
   <% end -%>
    next_steps.go();
  },
  block_predecessors: function(next_steps) {
   <% # Block active todos that are successors of the uncompleted
      if @saved && @active_to_block
        # do not render the js in case of an error or if no todos to block
        @active_to_block.each do |t| %>
          $('#<%= dom_id(t) %>').slideUp(400, function() {
            $('#<%= dom_id(t) %>').remove();
   <%       if source_view_is(:project) or source_view_is(:tag) # Insert it in deferred/pending block if existing -%>
              $('#<%= item_container_id(t) %>_items').append("<%= js_render(t, { :parent_container_type => parent_container_type }) %>");
   <%       end -%>
          });
   <%   end -%>
   <% end -%>
    next_steps.go();
  },
  regenerate_predecessor_family: function(next_steps) {
    <%
    if @predecessors
      parents = @predecessors.to_a
      until parents.empty?
        parent = parents.pop
        parents += parent.predecessors -%>
        $('#<%= dom_id(parent) %>').html("<%= js_render(parent, { :parent_container_type => parent_container_type }) %>");
    <%end
    end
    -%>
    next_steps.go();
  },
  html_for_recurring_todo: function() {
    <%-
      js = @new_recurring_todo ? js_render(@new_recurring_todo, { :parent_container_type => parent_container_type }) : ""
    -%>
    return "<%= js %>";
  },
  html_for_todo: function() {
    <%-
      locals = {
        :parent_container_type => parent_container_type,
        :suppress_project => source_view_is(:project),
        :suppress_context => source_view_is(:context)
      }
      js = source_view_is(:done) ? "" : js_render(@todo, locals)
    -%>
    return "<%= js %>";
  }
}

<%=object_name%>.animate();
<% end -%>
